package com.yeqian.config;

import com.yeqian.controller.ArticleController;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @Author : yeqian
 * @Date : 2020/12/30 19:36
 * <p>
 * spring权限配置类
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 过滤请求
     *
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //配置请求规则
        http.authorizeRequests()
                //登录也所有人都可以访问
                .antMatchers("/").permitAll()
                .antMatchers("/index").authenticated();
        /*
        1）DENY — 表示该页面不允许在 frame 中展示，即便是在相同域名的页面中嵌套也不允许。
        2）SAMEORIGIN — 表示该页面可以在相同域名页面的 frame 中展示。
        3）ALLOW-FROM https://example.com/ — 表示该页面可以在指定来源的 frame 中展示*/
        http.headers().frameOptions().sameOrigin();
        //Springsecurity会默认开启csrf功能，需要将其关闭，否则只能使用get请求来提交
        http.csrf().disable();
        http.formLogin().loginPage("/login").defaultSuccessUrl("/index");
        http.logout().logoutSuccessUrl("/login");
    }

    /**
     * 注入我们自己的 认证提供者
     */
    @Autowired
    private AuthenticationProvider provider;

    /**
     * 认证及授权
     *
     * @param auth
     * @return void
     * @author yeqian
     * @date 2020/12/30 20:52
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(provider);

        //logger.error("用户提交的用户名"+principal.getUsername());

        //后台密码=盐+原始密码，最后加密算法
        //如何保证前台传来的密码与后台返回的密码相等
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}
